const Joi = require('joi');
const mongoose = require('mongoose');

/**
 * 获取食谱列表的验证规则
 */
const getRecipes = {
  query: Joi.object().keys({
    name: Joi.string(),
    difficulty: Joi.string().valid('简单', '中等', '困难'),
    isVerified: Joi.boolean(),
    isPublished: Joi.boolean(),
    tags: Joi.string(),
    sortBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(1),
  }),
};

/**
 * 食谱验证器
 * @param {Object} data - 待验证的数据
 * @param {boolean} [isUpdate=false] - 是否是更新操作
 * @returns {Object} 验证结果
 */
const validateRecipe = async (data, isUpdate = false) => {
  const schema = Joi.object({
    title: isUpdate ? Joi.string().max(100).trim() : Joi.string().required().max(100).trim(),
    description: isUpdate ? Joi.string().max(2000).trim() : Joi.string().required().max(2000).trim(),
    coverImage: isUpdate ? Joi.string().trim() : Joi.string().required().trim(),
    category: isUpdate ? Joi.object({
      _id: Joi.string().custom((value, helpers) => {
        if (!mongoose.Types.ObjectId.isValid(value)) {
          return helpers.error('any.invalid');
        }
        return value;
      }).messages({
        'any.invalid': '分类ID格式不正确'
      }),
      name: Joi.string()
    }) : Joi.object({
      _id: Joi.string().required().custom((value, helpers) => {
        if (!mongoose.Types.ObjectId.isValid(value)) {
          return helpers.error('any.invalid');
        }
        return value;
      }).messages({
        'any.invalid': '分类ID格式不正确'
      }),
      name: Joi.string()
    }).required(),
    difficulty: isUpdate ? Joi.number().min(1).max(5) : Joi.number().required().min(1).max(5),
    prepTime: isUpdate ? Joi.number().min(0) : Joi.number().required().min(0),
    cookTime: isUpdate ? Joi.number().min(0) : Joi.number().required().min(0),
    servings: isUpdate ? Joi.number().min(1) : Joi.number().required().min(1),
    ingredients: isUpdate ? Joi.array().items(
      Joi.object({
        food: Joi.object({
          _id: Joi.string().custom((value, helpers) => {
            if (!mongoose.Types.ObjectId.isValid(value)) {
              return helpers.error('any.invalid');
            }
            return value;
          }).messages({
            'any.invalid': '食材ID格式不正确'
          }),
          name: Joi.string()
        }),
        amount: Joi.number().min(0),
        unit: Joi.string().trim()
      })
    ) : Joi.array().required().items(
      Joi.object({
        food: Joi.object({
          _id: Joi.string().required().custom((value, helpers) => {
            if (!mongoose.Types.ObjectId.isValid(value)) {
              return helpers.error('any.invalid');
            }
            return value;
          }).messages({
            'any.invalid': '食材ID格式不正确'
          }),
          name: Joi.string()
        }).required(),
        amount: Joi.number().required().min(0),
        unit: Joi.string().required().trim()
      })
    ),
    steps: isUpdate ? Joi.array().items(
      Joi.object({
        stepNumber: Joi.number().min(1),
        description: Joi.string().trim(),
        image: Joi.string().trim()
      })
    ) : Joi.array().required().items(
      Joi.object({
        stepNumber: Joi.number().required().min(1),
        description: Joi.string().required().trim(),
        image: Joi.string().trim()
      })
    ),
    nutrition: isUpdate ? Joi.object({
      calories: Joi.number().min(0),
      protein: Joi.number().min(0),
      fat: Joi.number().min(0),
      carbohydrate: Joi.number().min(0)
    }) : Joi.object({
      calories: Joi.number().required().min(0),
      protein: Joi.number().required().min(0),
      fat: Joi.number().required().min(0),
      carbohydrate: Joi.number().required().min(0)
    }).required(),
    tags: Joi.array().items(Joi.string().trim()),
    isVerified: Joi.boolean()
  });

  try {
    await schema.validateAsync(data, { abortEarly: false });
    return {
      isValid: true,
      message: ''
    };
  } catch (error) {
    return {
      isValid: false,
      message: error.details.map(detail => detail.message).join('; ')
    };
  }
};

module.exports = {
  getRecipes,
  validateRecipe
}; 